#include "smg.h"
#include "delay.h"
#include "led.h"
#include "sys.h"
#include "key.h"
#include "exti.h"
#include "timer.h"
static int wait_t,yl,gr,rewait;
char flag;
char stop,swi_road,swi_yl=1;
static int keyup;
static int tmp,count,deco=0;
int i =0;
int main(void)
{	flag=1;stop=0;keyup=0;count=0;
	delay_init();	    //延时函数初始化	
  SMG_Init();			//初始化SMG
	LED_Init();   		//交通灯初始化
	KEY_Init ();		//按键初始化
	EXTIX_Init();       //中断初始化
	TIM3_Int_Init(4999,7199);//初始化定时器（500ms）
	wait_t=10;			//红灯时间调整
	rewait=10;			//红灯时间重装（时间调整辅助位）
	yl=3;               //黄灯时间
	gr=10;				//绿灯时间调整
	WEI1=1;				//一号数码管
	WEI2=1;				//二号数码管
	swi_road=0;         //切换A、B道操作控制位
	while(1)
{		tmp=rewait;
		if(KEY1_STA==0&&keyup==0)	{
			delay_ms(10);   //消抖
			count=0;		//清除按键等待
			keyup=1;		//使按键连按失效
			flag=0;         //进入倒计时调整
			wait_t = rewait;//暂存等待时间
			rewait =wait_t+1;//等待时间加1
			}	
		if(KEY2_STA==0&&keyup==0)	{
			delay_ms(10);   //消抖	
			count=0;
			flag=0;keyup=1;
			wait_t = rewait;
			rewait = wait_t-1;//等待时间减1
			}	
		if(KEY3_STA==0&&keyup==0){
			if(swi_road==0){//跳过A道红灯等待 
				delay_ms(10);   //消抖	
				wait_t=0;		//跳过B道等待
				yl=0;			//跳过黄灯
				}
			if(swi_road==1){//跳过A道红灯等待
				delay_ms(10);   //消抖	
				yl=0;			//跳过黄灯
				gr=0;			//跳过B道等待
				}
			}	
		if(keyup==0){//按键等待
			delay_ms(10);
			count++;  //按键等待计数加1
			if(count==70&&tmp-rewait==0&&stop==0){/*达到一定时间且无计时加减操作、不在强制状态中*/
				count=0;//计时清零
				flag=1;//开启红绿灯功能
			}
		}
		if(KEY1_STA==1&&KEY2_STA==1&&KEY3_STA==1&&keyup==1)	keyup=0;/*使按键松开之后才能再次按下*/
		if(flag){
			if(wait_t>0){
				GREEN=1;
				YELLOW=1;
				RED=0;
				GREEN2=0;
				YELLOW2=1;
				RED2=1;
				if(wait_t!=rewait)
				swi_road=!swi_road;//切换道路
				SMG_display(wait_t);//显示红灯倒计时
			}else if(yl>0){
				RED=1;
				GREEN=1;
				YELLOW=0;
				GREEN2=1;
				YELLOW2=0;
				RED2=1;
				SMG_display(yl);//显示黄灯倒计时
			}else if(gr>0){
				YELLOW=1;
				RED=1;
				GREEN=0;
				GREEN2=1;
				YELLOW2=1;
				RED2=0;
				if(gr!=rewait)
				swi_road=!swi_road;//切换道路
				SMG_display(gr);//显示绿灯倒计时
			}else if(swi_yl){
				yl=3;		  //黄灯倒计时重装
				swi_yl=!swi_yl;
			}else{
				wait_t=rewait;//红灯倒计时重装
				yl=3;		  //黄灯倒计时重装
				gr=rewait;		//绿灯倒计时重装
				swi_yl=!swi_yl;
			}
		}else{
			if(stop){//强制状态
				SMG_second(0);//显示0
			}else
				SMG_second(rewait);//显示调整的时间
		}
	}
}
void EXTI0_IRQHandler(void)
{		delay_ms(10);   //消抖	
		if(KEY0_STA==0&&keyup==0)	{
			keyup=1; //使键盘失效
			flag=!flag; //进去or退出正常状态
			stop=!stop; //进去or退出强制状态
			RED=0;
			GREEN=1;
			YELLOW=1;
			GREEN2=1;
			YELLOW2=1;
			RED2=0;
		}
		EXTI_ClearITPendingBit(EXTI_Line0); // 清除 LINE 上的中断标志位
}

//定时器3中断服务程序
void TIM3_IRQHandler(void)   //TIM3中断
{
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  /*检查TIM3更新中断发生与否*/
		{
		deco+=1;
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  /*清除TIMx更新中断标志*/ 
		if(deco==2){//1秒定时
			deco=0;
		if(wait_t>0){
				wait_t--;
			}else if(yl>0){
				yl--;
			}else if(gr>0){
				gr--;
			}
		}
		}
}
